/* 
 * File:   JogoManager.cpp
 * Author: Ana Paula
 * 
 * Created on 13 de Julho de 2011, 10:33
 */

#include "JogoManager.hpp"
#include <iostream>
#include <boost/thread.hpp>
#include "JogoManager.hpp"
#include <iostream>
#include <fstream>

void run(JogoManager* man) {
//void JogoManager::run() {
    
    //std::ofstream o;
    //o.open("out.txt");
    //this->f->setVisible(false);

    //this->exec();
    
    //while (true) {

        //std::cout << "Receive " << std::endl;
        //o << "Receive" << std::endl;
        //o.write("Receive", 7);
        Jogador* jog1 = new Jogador('X');
        Jogador* jog2 = new Jogador('O');
        
        unsigned char ch;
        man->pilha->le(&ch, 1);
        //std::cout << ch << std::endl;
        unsigned char* msg = (unsigned char*) "I";
        std::cout << "Sending init game" << std::cout;
        man->pilha->escreve(man->ipServer, 1, msg);

        bool f = false;
        while (true) {

            std::cout << "Reading char..." << std::endl;
            man->pilha->le(&ch, 1);
            if (f) {

                if (ch == '1') {

                    std::cout << "Receiving player id 1" << std::cout;
                    man->jogadorLocal = jog1;
                    break;
                } else if (ch == '2') {

                    std::cout << "Receiving player id 2" << std::cout;
                    man->jogadorLocal = jog2;
                    break;
                }
            } else {

                if (ch == 'I') {

                    std::cout << "Receiving init ack" << std::endl;
                    f = true;
                }
            }
        }

        
        man->jogo = new Jogo(jog1, jog2);
        man->status = JogoManager::INITED;
        int i;
        int j;
        unsigned char* cm = 0;

        while (true) {

            man->pilha->le(&ch, 1);
            switch (ch) {

                case 'E':

                    //Jogada impossível
                    if (man->status == JogoManager::WAITING_RESPONSE) {

                        //Jogada fail
                        man->status = JogoManager::INITED;
                    }
                    break;

                case 'U':

                    //precisamos de mais dois caracteres para compor a mensagem
                    cm = new unsigned char[2];
                    man->pilha->le(cm, 2);

                    i = cm[0] - '0';
                    j = cm[1] - '0';
                    man->jogo->fazerJogada(i, j);
                    if (man->jogo->isFimDoJogo()) {

                        if (man->jogo->houveVencedor()) {

                            if (man->jogo->getVencedor() == man->jogadorLocal) {

                                //TODO Atualiza UI para você venceu
                            } else {

                                //TODO atualiza UI para você perdeu
                            }
                        } else {

                            //TODO Atualiza GUI para velha
                        }
                    }
                    break;

                case 'O':

                    //Fizemos uma jogada e foi válida
                    if (man->status == JogoManager::WAITING_RESPONSE) {

                        man->jogo->fazerJogada(man->tji, man->tjj);
                        if (man->jogo->isFimDoJogo()) {

                            if (man->jogo->houveVencedor()) {

                                if (man->jogo->getVencedor() == man->jogadorLocal) {

                                    //TODO Atualiza UI para você venceu
                                } else {

                                    //TODO atualiza UI para você perdeu
                                }
                            } else {

                                //TODO Atualiza GUI para velha
                            }
                        }
                    }
                    break;
            }
        }
    //}

    //o.close();
}

JogoManager::JogoManager(int ipServer) {

    std::cout << "JogoManager::JogoManager" << std::endl;
    boost::thread(&run, this);
    this->ipServer = ipServer;
    this->pilha = new Pilha();
    this->status = JogoManager::NOT_INIT;
    
}

JogoManager::~JogoManager() {

    delete pilha;
}

